#pragma once

namespace DX4WRT
{
	namespace Direct3D
	{
		public enum class CBufferType
		{
			CBuffer = D3D_CT_CBUFFER,
			TBuffer = D3D_CT_TBUFFER,
			InterfacePointers = D3D_CT_INTERFACE_POINTERS,
			ResourceBindInfo = D3D_CT_RESOURCE_BIND_INFO,
		};

		public enum class FeatureLevel
		{
			Level9_1 = D3D_FEATURE_LEVEL_9_1,
			Level9_2 = D3D_FEATURE_LEVEL_9_2,
			Level9_3 = D3D_FEATURE_LEVEL_9_3,
			Level10_0 = D3D_FEATURE_LEVEL_10_0,
			Level10_1 = D3D_FEATURE_LEVEL_10_1,
			Level11_0 = D3D_FEATURE_LEVEL_11_0,
			Level11_1 = D3D_FEATURE_LEVEL_11_1	
		};

		public enum class DriverType
		{
			Unknown = D3D_DRIVER_TYPE_UNKNOWN,
			Hardware = D3D_DRIVER_TYPE_HARDWARE,
			Refrence = D3D_DRIVER_TYPE_REFERENCE,
			Null = D3D_DRIVER_TYPE_NULL,
			Software = D3D_DRIVER_TYPE_SOFTWARE,
			Warp = D3D_DRIVER_TYPE_WARP
		};

		public enum class IncludeType 
		{
			Local = D3D_INCLUDE_LOCAL,
			System = D3D_INCLUDE_SYSTEM
		};

		public enum class Name
		{
			Undefined = D3D_NAME_UNDEFINED,
			Position = D3D_NAME_POSITION,
			ClipDistance = D3D_NAME_CLIP_DISTANCE,
			CullDistance = D3D_NAME_CULL_DISTANCE,
			RenderTargetArrayIndex = D3D_NAME_RENDER_TARGET_ARRAY_INDEX,
			ViewportArrayIndex = D3D_NAME_VIEWPORT_ARRAY_INDEX,
			VertexId = D3D_NAME_VERTEX_ID,
			PrimitiveId = D3D_NAME_PRIMITIVE_ID,
			InstanceId = D3D_NAME_INSTANCE_ID,
			IsFontFace = D3D_NAME_IS_FRONT_FACE,
			SampleIndex = D3D_NAME_SAMPLE_INDEX,
			FinalQuadEdgeTessFactor = D3D_NAME_FINAL_QUAD_EDGE_TESSFACTOR,
			FinalQuadInsideTessFactor = D3D_NAME_FINAL_QUAD_INSIDE_TESSFACTOR,
			FinalTriEdgeTessFactor = D3D_NAME_FINAL_TRI_EDGE_TESSFACTOR,
			FinalTriInsideTessFactor = D3D_NAME_FINAL_TRI_INSIDE_TESSFACTOR,
			FinalLineDetailTessFactor = D3D_NAME_FINAL_LINE_DETAIL_TESSFACTOR,
			FinalLineDensityTessFactor = D3D_NAME_FINAL_LINE_DENSITY_TESSFACTOR,
			Target = D3D_NAME_TARGET,
			Depth = D3D_NAME_DEPTH,
			Coverage = D3D_NAME_COVERAGE,
			DepthGreaterEqual = D3D_NAME_DEPTH_GREATER_EQUAL,
			DepthLessEqual = D3D_NAME_DEPTH_LESS_EQUAL,
		};

		public enum class Primitive
		{
			Undefined = D3D_PRIMITIVE_UNDEFINED,
			Point = D3D_PRIMITIVE_POINT,
			Line = D3D_PRIMITIVE_LINE,
			Triangle = D3D_PRIMITIVE_TRIANGLE,
			LineAdj = D3D_PRIMITIVE_LINE_ADJ,
			TriangleAdj = D3D_PRIMITIVE_TRIANGLE_ADJ,
			Control1PointPatch = D3D_PRIMITIVE_1_CONTROL_POINT_PATCH,
			Control2PointPatch = D3D_PRIMITIVE_2_CONTROL_POINT_PATCH,
			Control3PointPatch = D3D_PRIMITIVE_3_CONTROL_POINT_PATCH,
			Control4PointPatch = D3D_PRIMITIVE_4_CONTROL_POINT_PATCH,
			Control5PointPatch = D3D_PRIMITIVE_5_CONTROL_POINT_PATCH,
			Control6PointPatch = D3D_PRIMITIVE_6_CONTROL_POINT_PATCH,
			Control7PointPatch = D3D_PRIMITIVE_7_CONTROL_POINT_PATCH,
			Control8PointPatch = D3D_PRIMITIVE_8_CONTROL_POINT_PATCH,
			Control9PointPatch = D3D_PRIMITIVE_9_CONTROL_POINT_PATCH,
			Control10PointPatch = D3D_PRIMITIVE_10_CONTROL_POINT_PATCH,
			Control11PointPatch = D3D_PRIMITIVE_11_CONTROL_POINT_PATCH,
			Control12PointPatch = D3D_PRIMITIVE_12_CONTROL_POINT_PATCH,
			Control13PointPatch = D3D_PRIMITIVE_13_CONTROL_POINT_PATCH,
			Control14PointPatch = D3D_PRIMITIVE_14_CONTROL_POINT_PATCH,
			Control15PointPatch = D3D_PRIMITIVE_15_CONTROL_POINT_PATCH,
			Control16PointPatch = D3D_PRIMITIVE_16_CONTROL_POINT_PATCH,
			Control17PointPatch = D3D_PRIMITIVE_17_CONTROL_POINT_PATCH,
			Control18PointPatch = D3D_PRIMITIVE_18_CONTROL_POINT_PATCH,
			Control19PointPatch = D3D_PRIMITIVE_19_CONTROL_POINT_PATCH,
			Control20PointPatch = D3D_PRIMITIVE_20_CONTROL_POINT_PATCH,
			Control21PointPatch = D3D_PRIMITIVE_21_CONTROL_POINT_PATCH,
			Control22PointPatch = D3D_PRIMITIVE_22_CONTROL_POINT_PATCH,
			Control23PointPatch = D3D_PRIMITIVE_23_CONTROL_POINT_PATCH,
			Control24PointPatch = D3D_PRIMITIVE_24_CONTROL_POINT_PATCH,
			Control25PointPatch = D3D_PRIMITIVE_25_CONTROL_POINT_PATCH,
			Control26PointPatch = D3D_PRIMITIVE_26_CONTROL_POINT_PATCH,
			Control27PointPatch = D3D_PRIMITIVE_27_CONTROL_POINT_PATCH,
			Control28PointPatch = D3D_PRIMITIVE_28_CONTROL_POINT_PATCH,
			Control29PointPatch = D3D_PRIMITIVE_29_CONTROL_POINT_PATCH,
			Control30PointPatch = D3D_PRIMITIVE_30_CONTROL_POINT_PATCH,
			Control31PointPatch = D3D_PRIMITIVE_31_CONTROL_POINT_PATCH,
			Control32PointPatch = D3D_PRIMITIVE_32_CONTROL_POINT_PATCH 
		};

		public enum class PrimitiveTopology
		{
			Undefined = D3D_PRIMITIVE_TOPOLOGY_UNDEFINED,
			PointList = D3D_PRIMITIVE_TOPOLOGY_POINTLIST,
			LineList = D3D_PRIMITIVE_TOPOLOGY_LINELIST,
			LineStrip = D3D_PRIMITIVE_TOPOLOGY_LINESTRIP,
			TriangleList = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST,
			TriangleStrip = D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP,
			LineListAdj = D3D_PRIMITIVE_TOPOLOGY_LINELIST_ADJ,
			LineStripAdj = D3D_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ,
			TriangleListAdj = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ,
			TriangleStripAdj = D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ,
			Control1PointPatchList = D3D_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST,
			Control2PointPatchList = D3D_PRIMITIVE_TOPOLOGY_2_CONTROL_POINT_PATCHLIST,
			Control3PointPatchList = D3D_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST,
			Control4PointPatchList = D3D_PRIMITIVE_TOPOLOGY_4_CONTROL_POINT_PATCHLIST,
			Control5PointPatchList = D3D_PRIMITIVE_TOPOLOGY_5_CONTROL_POINT_PATCHLIST,
			Control6PointPatchList = D3D_PRIMITIVE_TOPOLOGY_6_CONTROL_POINT_PATCHLIST,
			Control7PointPatchList = D3D_PRIMITIVE_TOPOLOGY_7_CONTROL_POINT_PATCHLIST,
			Control8PointPatchList = D3D_PRIMITIVE_TOPOLOGY_8_CONTROL_POINT_PATCHLIST,
			Control9PointPatchList = D3D_PRIMITIVE_TOPOLOGY_9_CONTROL_POINT_PATCHLIST,
			Control01PointPatchList = D3D_PRIMITIVE_TOPOLOGY_10_CONTROL_POINT_PATCHLIST,
			Control11PointPatchList = D3D_PRIMITIVE_TOPOLOGY_11_CONTROL_POINT_PATCHLIST,
			Control12PointPatchList = D3D_PRIMITIVE_TOPOLOGY_12_CONTROL_POINT_PATCHLIST,
			Control13PointPatchList = D3D_PRIMITIVE_TOPOLOGY_13_CONTROL_POINT_PATCHLIST,
			Control14PointPatchList = D3D_PRIMITIVE_TOPOLOGY_14_CONTROL_POINT_PATCHLIST,
			Control15PointPatchList = D3D_PRIMITIVE_TOPOLOGY_15_CONTROL_POINT_PATCHLIST,
			Control16PointPatchList = D3D_PRIMITIVE_TOPOLOGY_16_CONTROL_POINT_PATCHLIST,
			Control17PointPatchList = D3D_PRIMITIVE_TOPOLOGY_17_CONTROL_POINT_PATCHLIST,
			Control18PointPatchList = D3D_PRIMITIVE_TOPOLOGY_18_CONTROL_POINT_PATCHLIST,
			Control19PointPatchList = D3D_PRIMITIVE_TOPOLOGY_19_CONTROL_POINT_PATCHLIST,
			Control20PointPatchList = D3D_PRIMITIVE_TOPOLOGY_20_CONTROL_POINT_PATCHLIST,
			Control21PointPatchList = D3D_PRIMITIVE_TOPOLOGY_21_CONTROL_POINT_PATCHLIST,
			Control22PointPatchList = D3D_PRIMITIVE_TOPOLOGY_22_CONTROL_POINT_PATCHLIST,
			Control23PointPatchList = D3D_PRIMITIVE_TOPOLOGY_23_CONTROL_POINT_PATCHLIST,
			Control24PointPatchList = D3D_PRIMITIVE_TOPOLOGY_24_CONTROL_POINT_PATCHLIST,
			Control25PointPatchList = D3D_PRIMITIVE_TOPOLOGY_25_CONTROL_POINT_PATCHLIST,
			Control26PointPatchList = D3D_PRIMITIVE_TOPOLOGY_26_CONTROL_POINT_PATCHLIST,
			Control27PointPatchList = D3D_PRIMITIVE_TOPOLOGY_27_CONTROL_POINT_PATCHLIST,
			Control28PointPatchList = D3D_PRIMITIVE_TOPOLOGY_28_CONTROL_POINT_PATCHLIST,
			Control29PointPatchList = D3D_PRIMITIVE_TOPOLOGY_29_CONTROL_POINT_PATCHLIST,
			Control30PointPatchList = D3D_PRIMITIVE_TOPOLOGY_30_CONTROL_POINT_PATCHLIST,
			Control31PointPatchList = D3D_PRIMITIVE_TOPOLOGY_31_CONTROL_POINT_PATCHLIST,
			Control32PointPatchList = D3D_PRIMITIVE_TOPOLOGY_32_CONTROL_POINT_PATCHLIST 
		};

		public enum class RegisterCombonentType
		{
			Unknown = D3D_REGISTER_COMPONENT_UNKNOWN,
			UInt32 = D3D_REGISTER_COMPONENT_UINT32,
			SInt32 = D3D_REGISTER_COMPONENT_SINT32,
			Float32 = D3D_REGISTER_COMPONENT_FLOAT32
		};

		public enum class ResourceReturnType
		{
			UNorm = D3D_RETURN_TYPE_UNORM,
			SNorm = D3D_RETURN_TYPE_SNORM,
			SInt = D3D_RETURN_TYPE_SINT,
			UInt = D3D_RETURN_TYPE_UINT,
			Float = D3D_RETURN_TYPE_FLOAT,
			Mixed = D3D_RETURN_TYPE_MIXED,
			Double = D3D_RETURN_TYPE_DOUBLE,
			Continued = D3D_RETURN_TYPE_CONTINUED 
		};

		public enum class ShaderCBuffer
		{
			UserPacked = D3D_CBF_USERPACKED
		};

		public enum class ShaderInput
		{
			UserPacked =  D3D_SIF_USERPACKED,
			ComparisonSampler = D3D_SIF_COMPARISON_SAMPLER,
			TextureComponent0 = D3D_SIF_TEXTURE_COMPONENT_0,
			TextureComponent1 = D3D_SIF_TEXTURE_COMPONENT_1,
			TextureComponents = D3D_SIF_TEXTURE_COMPONENTS,
			Unused = D3D_SIF_UNUSED
		};

		public enum class ShaderInputType
		{
			CBuffer = D3D_SIT_CBUFFER,
			TBuffer = D3D_SIT_TBUFFER,
			Texture = D3D_SIT_TEXTURE,
			Sampler = D3D_SIT_SAMPLER,
			UAVRWTyped = D3D_SIT_UAV_RWTYPED,
			Structured = D3D_SIT_STRUCTURED,
			UAVRWStructured = D3D_SIT_UAV_RWSTRUCTURED,
			ByteAddress = D3D_SIT_BYTEADDRESS,
			TWByteAddress = D3D_SIT_UAV_RWBYTEADDRESS,
			UAVAppendStructured = D3D_SIT_UAV_APPEND_STRUCTURED,
			UAVConsumeStrcutured = D3D_SIT_UAV_CONSUME_STRUCTURED,
			UAVRWStucturedWithCounter = D3D_SIT_UAV_RWSTRUCTURED_WITH_COUNTER
		};

		public enum class ShaderVariableClass
		{
			Scalar = D3D_SVC_SCALAR,
			Vector = D3D_SVC_VECTOR,
			MatrixRows = D3D_SVC_MATRIX_ROWS,
			MatrixColumns = D3D_SVC_MATRIX_COLUMNS,
			Object = D3D_SVC_OBJECT,
			Strcut = D3D_SVC_STRUCT,
			InterfaceClass = D3D_SVC_INTERFACE_CLASS,
			InterfacePointer = D3D_SVC_INTERFACE_POINTER
		};

		public enum class ShaderVariable
		{
			Userpacked = D3D_SVF_USERPACKED,
			Used = D3D_SVF_USED,
			InterfacePointer = D3D_SVF_INTERFACE_POINTER,
			InterfaceParameter = D3D_SVF_INTERFACE_PARAMETER,
		};

		public enum class ShaderVariableType
		{
			Void = D3D_SVT_VOID,
			Bool = D3D_SVT_BOOL,
			Int = D3D_SVT_INT,
			Float = D3D_SVT_FLOAT,
			String = D3D_SVT_STRING,
			Texture = D3D_SVT_TEXTURE,
			Texture1D = D3D_SVT_TEXTURE1D,
			Texture2D = D3D_SVT_TEXTURE2D,
			Texture3D = D3D_SVT_TEXTURE3D,
			TextureCube = D3D_SVT_TEXTURECUBE,
			Sampler = D3D_SVT_SAMPLER,
			PixelShader = D3D_SVT_PIXELSHADER,
			VertexShader = D3D_SVT_VERTEXSHADER,
			UInt = D3D_SVT_UINT,
			UInt8 = D3D_SVT_UINT8,
			GeometryShader = D3D_SVT_GEOMETRYSHADER,
			Rasterrizer = D3D_SVT_RASTERIZER,
			DepthStencil = D3D_SVT_DEPTHSTENCIL,
			Blend = D3D_SVT_BLEND,
			Buffer = D3D_SVT_BUFFER,
			CBuffer = D3D_SVT_CBUFFER,
			TBuffer = D3D_SVT_TBUFFER,
			Texture1DArray = D3D_SVT_TEXTURE1DARRAY,
			Texture2DArray = D3D_SVT_TEXTURE2DARRAY,
			RenderTargetView = D3D_SVT_RENDERTARGETVIEW,
			DepthStencilView = D3D_SVT_DEPTHSTENCILVIEW,
			Texture2DMS = D3D_SVT_TEXTURE2DMS,
			Texture2DMSArray = D3D_SVT_TEXTURE2DMSARRAY,
			TextureCubeArray = D3D_SVT_TEXTURECUBEARRAY,
			HullShader = D3D_SVT_HULLSHADER,
			DomainShader = D3D_SVT_DOMAINSHADER,
			InterfacePointer = D3D_SVT_INTERFACE_POINTER,
			ComputeShader = D3D_SVT_COMPUTESHADER,
			Double = D3D_SVT_DOUBLE,
			RWTexture1D = D3D_SVT_RWTEXTURE1D,
			RWTexture1DArray = D3D_SVT_RWTEXTURE1DARRAY,
			RWTexture2D = D3D_SVT_RWTEXTURE2D,
			RWTexture2DArray = D3D_SVT_RWTEXTURE2DARRAY,
			RWTexture3D = D3D_SVT_RWTEXTURE3D,
			RWBuffer = D3D_SVT_RWBUFFER,
			ByteAddressBuffer = D3D_SVT_BYTEADDRESS_BUFFER,
			RWByteAddressBuffer = D3D_SVT_RWBYTEADDRESS_BUFFER,
			StructuredBuffer = D3D_SVT_STRUCTURED_BUFFER,
			RWStructuredBuffer = D3D_SVT_RWSTRUCTURED_BUFFER,
			AppendStructuredBuffer = D3D_SVT_APPEND_STRUCTURED_BUFFER,
			ConsumeStructureBuffer = D3D_SVT_CONSUME_STRUCTURED_BUFFER
		};

		public enum class SRVDimension
		{
			Unknown = D3D_SRV_DIMENSION_UNKNOWN,
			Texture1D = D3D_SRV_DIMENSION_TEXTURE1D,
			Texture1DArray = D3D_SRV_DIMENSION_TEXTURE1DARRAY,
			Texture2D = D3D_SRV_DIMENSION_TEXTURE2D,
			Texture2DArray = D3D_SRV_DIMENSION_TEXTURE2DARRAY,
			Texture2DMS = D3D_SRV_DIMENSION_TEXTURE2DMS,
			Texture2DMSArray = D3D_SRV_DIMENSION_TEXTURE2DMSARRAY,
			Texture3D = D3D_SRV_DIMENSION_TEXTURE3D,
			TextureCube = D3D_SRV_DIMENSION_TEXTURECUBE,
			TextureCubeArray = D3D_SRV_DIMENSION_TEXTURECUBEARRAY,
			BufferEx = D3D_SRV_DIMENSION_BUFFEREX
		};

		public enum class TessellatorDomain
		{
			Undefined = D3D_TESSELLATOR_DOMAIN_UNDEFINED,
			Isoline = D3D_TESSELLATOR_DOMAIN_ISOLINE,
			Tri = D3D_TESSELLATOR_DOMAIN_TRI,
			Quad = D3D_TESSELLATOR_DOMAIN_QUAD 
		};

		public enum class TessellatorOutputPrimitive
		{
			Undefined = D3D_TESSELLATOR_OUTPUT_UNDEFINED,
			Point = D3D_TESSELLATOR_OUTPUT_POINT,
			Line = D3D_TESSELLATOR_OUTPUT_LINE,
			TriangleCW = D3D_TESSELLATOR_OUTPUT_TRIANGLE_CW,
			TriangleCCW = D3D_TESSELLATOR_OUTPUT_TRIANGLE_CCW 
		};

		public enum class TessellatorPartitioning
		{
			Undefined = D3D_TESSELLATOR_PARTITIONING_UNDEFINED,
			Integer = D3D_TESSELLATOR_PARTITIONING_INTEGER,
			Pow2 = D3D_TESSELLATOR_PARTITIONING_POW2,
			Odd = D3D_TESSELLATOR_PARTITIONING_FRACTIONAL_ODD,
			Even = D3D_TESSELLATOR_PARTITIONING_FRACTIONAL_EVEN 
		};
	}
}